package com.uva.dbcs.gestionDeVehiculos.persistencia.impl;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.uva.dbcs.gestionDeVehiculos.dominio.Fabricante;
import com.uva.dbcs.gestionDeVehiculos.dominio.Vehiculo;
import com.uva.dbcs.gestionDeVehiculos.persistencia.VehiculoDAO;
import com.uva.dbcs.utilidades.persistencia.GenericAbstractDAO;

@Stateless
public class VehiculoDAOImpl extends GenericAbstractDAO<Vehiculo, Integer> implements
		VehiculoDAO {

	@PersistenceContext
	private EntityManager entityManager;
	
	public VehiculoDAOImpl() {
		super(Vehiculo.class);
	}

	@Override
	public EntityManager getEntityManager() {
		
		return entityManager;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Vehiculo> find(int costeMaximo, int costeMinimo, boolean gps,
			Fabricante fabricante, int puertas) {
		
		// tenemos que construir la quuery dinamicamente en jpql
		StringBuilder sb = new StringBuilder();
		boolean estaCosteMaximo= false;
		boolean estaCosteMinimo = false;
		boolean estaGPS= false;
		boolean estaFabricante = false;
		boolean estaPuertas = false;
		
		sb.append("SELECT v FROM Vehiculo v where 1=1 ");
		
		if (costeMaximo>0){
			
			sb.append(" and v.modelo.costeAlquiler <= :costeMaximo");
			estaCosteMaximo= true;
		}
		
		if (costeMinimo>0){
			sb.append(" and v.modelo.costeAlquiler >= :costeMinimo");
			estaCosteMinimo= true;
			
		}
		
		if (gps == true){
			sb.append(" and v.modelo.gps = :gps");
			estaGPS= true;
		}
		
		if (fabricante !=null){
			sb.append(" and v.modelo.fabricante = :fabricante");
			estaFabricante= true;
		}
		
		if (puertas > 0){
			sb.append(" and v.modelo.puertas >= :puertas");
			estaPuertas= true;
			
		}
		
		Query query = getEntityManager().createQuery(sb.toString(), Vehiculo.class);
		
		if (estaCosteMaximo){
			query.setParameter("costeMaximo", costeMaximo);
		}
		if (estaCosteMinimo){
			query.setParameter("costeMinimo", costeMinimo);		
		}
		if (estaGPS){
			query.setParameter("gps", gps);
		}
		if (estaFabricante){
			query.setParameter("fabricante", fabricante);
		}
		if (estaPuertas){
			query.setParameter("puertas", puertas);

		}
		
		return query.getResultList();
	}



}
